/****************************** Module Header ******************************\
*
* Module Name: PMORD.H
*
* This is the include file which defines all the structures and constants
* that can be used to build or intepret GOCA orders for the GPI
*
* Copyright (c) 1989-1990, Microsoft Corporation.  All rights reserved.
*
* ==========================================================================
*
* The orders fall into 4 categories :-
*
* 1) 1-byte orders
*
* 2) 2-byte orders    - second byte contains the value
*
* 3) Long orders      - second byte gives the order length, subsequent bytes
*			contain the values (up to 256 bytes long)
*
* 4) Very long orders - third and fourth bytes gives the order length,
*			subsequent bytes contain the values (up to 64K long)
*
\***************************************************************************/

/***************************************************************************\
*
* Miscellaneous structures used in this file
*
\***************************************************************************/

#define PMORD_INCLUDED

/* form of RECTL with shorts instead of longs */
typedef struct _RECT1S {	/* rcs */
	SHORT xLeft;
	SHORT yBottom;
	SHORT xRight;
	SHORT yTop;
} RECT1S;

/* form of POINTL with 1 byte offsets instead of longs */
typedef struct _ODPOINT {	/* odpt */
	CHAR dx;
	CHAR dy;
} ODPOINT;

/* form of SIZEL with shorts instead of longs */
typedef struct _SIZES { 	/* sizs */
	SHORT cx;
	SHORT cy;
} SIZES;

/* unsigned two-byte swapped integer */
typedef struct _SWPUSHORT {	/* swpus */
	UCHAR HiByte;
	UCHAR LoByte;
} SWPUSHORT;

/***************************************************************************\
*
* 1-byte orders
*
\***************************************************************************/

/* macro to tell whether this is a 1-byte order */
#define BYTE_ORDER(oc)	((oc)==OCODE_GNOP1 || (oc)==OCODE_GESD)

/* 1-byte order codes */
#define OCODE_GNOP1	0x00		/* No-operation 	 */
#define OCODE_GESD	0xFF		/* End symbol definition */

/***************************************************************************\
*
* 2-byte orders
*
\***************************************************************************/

/* definitions to help determine whether an order code is a 2-byte order */
#define OCODE2_1	0x80
#define OCODE2_2	0x88

#define SHORT_ORDER(oc) ((((oc)^OCODE2_1)&OCODE2_2)==OCODE2_2)

/* General 2-byte order structure */
typedef struct _ORDER { 	/* ord */
	UCHAR idCode;
	UCHAR uchData;
} ORDER;

/* 2-byte order codes */
#define OCODE_GBAR	0x68		/* Begin area		       */
#define OCODE_GCFIG	0x7D		/* Close figure 	       */
#define OCODE_GEEL	0x49		/* End element		       */
#define OCODE_GEPTH	0x7F		/* End path		       */
#define OCODE_GEPROL	0x3E		/* End prologue 	       */
#define OCODE_GPOP	0x3F		/* Pop			       */
#define OCODE_GSBMX	0x0D		/* Set background mix	       */
#define OCODE_GPSBMX	0x4D		/* Push & set b/g mix	       */
#define OCODE_GSCD	0x3A		/* Set char direction	       */
#define OCODE_GPSCD	0x7A		/* Push & set char direction   */
#define OCODE_GSCR	0x39		/* Set char precision	       */
#define OCODE_GPSCR	0x79		/* Push & set char precision   */
#define OCODE_GSCS	0x38		/* Set char set 	       */
#define OCODE_GPSCS	0x78		/* Push & set char set	       */
#define OCODE_GSCOL	0x0A		/* Set color		       */
#define OCODE_GPSCOL	0x4A		/* Push & set color	       */
#define OCODE_GSLE	0x1A		/* Set line end 	       */
#define OCODE_GPSLE	0x5A		/* Push & set line end	       */
#define OCODE_GSLJ	0x1B		/* Set line join	       */
#define OCODE_GPSLJ	0x5B		/* Push & set line join        */
#define OCODE_GSLT	0x18		/* Set line type	       */
#define OCODE_GPSLT	0x58		/* Push & set line type        */
#define OCODE_GSLW	0x19		/* Set line width	       */
#define OCODE_GPSLW	0x59		/* Push & set line width       */
#define OCODE_GSMP	0x3B		/* Set marker precision        */
#define OCODE_GPSMP	0x7B		/* Push & set marker precision */
#define OCODE_GSMS	0x3C		/* Set marker set	       */
#define OCODE_GPSMS	0x7C		/* Push & set marker set       */
#define OCODE_GSMT	0x29		/* Set marker symbol	       */
#define OCODE_GPSMT	0x69		/* Push & set marker symbol    */
#define OCODE_GSMX	0x0C		/* Set mix		       */
#define OCODE_GPSMX	0x4C		/* Push & set mix	       */
#define OCODE_GSPS	0x08		/* Set pattern set	       */
#define OCODE_GPSPS	0x48		/* Push & set pattern set      */
#define OCODE_GSPT	0x28		/* Set pattern symbol	       */
#define OCODE_GPSPT	0x09		/* Push & set pattern symbol   */

/* constants for 2-byte orders */

/* Begin area */
#define GBAR_RESERVED	0x80
#define GBAR_BOUNDARY	0xC0
#define GBAR_NOBOUNDARY 0x80
#define GBAR_WINDING	0xA0
#define GBAR_ALTERNATE	0x80

/* Set Character Precision */
#define GSCR_PRECISION	0x0F

/***************************************************************************\
*
* Long orders
*
\***************************************************************************/

/* definitions to help determine whether an order code is a long order */

#define OCODE_VLONG    0xFE

#define LONG_ORDER(oc) (!((oc)==OCODE_VLONG||BYTE_ORDER(oc)||SHORT_ORDER(oc)))

/* long order structure */
#define LORDER_ML 253
typedef struct _LORDER {	/* lord */
	UCHAR idCode;
	UCHAR uchLength;
	UCHAR uchData[LORDER_ML];
} LORDER;

/* Long orders for which the length of data is normally zero */
#define OCODE_GEAR	0x60		/* End Area		       */
#define OCODE_GEIMG	0x93		/* End Image		       */

/* Long orders for which the data is contained in a type already defined */

/* Character String */
#define OCODE_GCCHST	0x83		/* char string at curr posn    */
#define GCCHST_MC	255		/* Max len of string in bytes  */

#define OCODE_GCHST	0xC3		/* char string at given pos    */
#define GCHST_SMC	251		/* Max len of string (S)       */
#define GCHST_LMC	247		/* Max len of string (L)       */

/* Character String Move */
#define OCODE_GCCHSTM	0xB1		/* char string move at c.p.    */
#define GCCHSTM_MC	255		/* Max len of string in byte   */

#define OCODE_GCHSTM	0xF1		/* char string move at g.p.    */
#define GCHSTM_SMC	251		/* Max len of string (S)       */
#define GCHSTM_LMC	247		/* Max len of string (L)       */

/* Comment */
#define OCODE_GCOMT	0x01		/* Comment		       */
#define GCOMT_ML	255		/* Maximum len of comment data */

/* Image */
#define OCODE_GIMD	0x92		/* Image data		       */
#define GIMD_ML 	255		/* Maximum len of image data   */

/* Full Arc */
#define OCODE_GCFARC	0x87		/* full arc at current posn    */
#define OCODE_GFARC	0xC7		/* full arc at given posn      */

/* Label */
#define OCODE_GLABL	0xD3		/* Label		       */

/* Set Current Position */
#define OCODE_GSCP	0x21		/* Set current position        */
#define OCODE_GPSCP	0x61		/* Push and set curr posn      */

/* Bezier spline */
#define OCODE_GCBEZ	0xA5		/* Bezier spline at curr pos   */
#define GCBEZ_SMB	21		/* Max number of splines (S)   */
#define GCBEZ_LMB	10		/* Max number of splines (L)   */

#define OCODE_GBEZ	0xE5		/* Bezier spline at given pos  */
#define GBEZ_SMB	20		/* Max number of splines (S)   */
#define GBEZ_LMB	10		/* Max number of splines (L)   */

/* Fillet */
#define OCODE_GCFLT	0x85		/* fillet at current posn      */
#define GCFLT_SMP	63		/* Max number of points (S)    */
#define GCFLT_LMP	31		/* Max number of points (L)    */

#define OCODE_GFLT	0xC5		/* fillet at given position    */
#define GFLT_SMP	62		/* Max number of points (S)    */
#define GFLT_LMP	30		/* Max number of points (L)    */

/* Polyline */
#define OCODE_GCLINE	0x81		/* polyline at current posn    */
#define GCLINE_SMP	63		/* Max number of points (S)    */
#define GCLINE_LMP	31		/* Max number of points (L)    */

#define OCODE_GLINE	0xC1		/* polyline at given posn      */
#define GLINE_SMP	62		/* Max number of points (S)    */
#define GLINE_LMP	30		/* Max number of points (L)    */

/* Polymarker */
#define OCODE_GCMRK	0x82		/* marker at current posn      */
#define GCMRK_SMP	63		/* Max number of points (S)    */
#define GCMRK_LMP	31		/* Max number of points (L)    */

#define OCODE_GMRK	0xC2		/* marker at given posn        */
#define GMRK_SMP	62		/* Max number of points (S)    */
#define GMRK_LMP	30		/* Max number of points (L)    */

/* Relative Line */
#define OCODE_GCRLINE	0xA1		/* Relative line at curr pos   */
#define GCRLINE_MP	127		/* Max number of points        */

#define OCODE_GRLINE	0xE1		/* Relative line at givn pos   */
#define GRLINE_SMP	125		/* Max number of points (S)    */
#define GRLINE_LMP	123		/* Max number of points (L)    */

/* Set Background Color */
#define OCODE_GSBCOL	0x25		/* Set background color        */
#define OCODE_GPSBCOL	0x65		/* Push and set b/g color      */

/* Set Extended Color */
#define OCODE_GSECOL	0x26		/* Set extended color	       */
#define OCODE_GPSECOL	0x66		/* Push and set ext color      */

/* Extended Color values */
#define SECOL_DEFAULT0	0x0000
#define SECOL_DEFAULT1	0xFF00
#define SECOL_NEUTRAL	0xFF07
#define SECOL_RESET	0xFF08

/* Set Character Angle */
#define OCODE_GSCA	0x34		/* Set character angle	       */
#define OCODE_GPSCA	0x74		/* Push and set char angle     */

/* Set Character Shear */
#define OCODE_GSCH	0x35		/* Set character shear	       */
#define OCODE_GPSCH	0x75		/* Push and set char shear     */

/* Set Fractional Line Width */
#define OCODE_GSFLW	0x11		/* Set fractional line width   */
#define OCODE_GPSFLW	0x51		/* Push and set frac l width   */

/* Set Pick Identifier */
#define OCODE_GSPIK	0x43		/* Set pick identifier	       */
#define OCODE_GPSPIK	0x23		/* Push and set pick id        */


/* Long Orders for which a structure can be defined for the data */

/* Arc */
#define OCODE_GCARC	0x86		/* Arc at Current Position     */
#define OCODE_GARC	0xC6		/* Arc at Given Position       */

typedef struct _ORDERS_GCARC {	/* osgcarc */
	POINTS ptInter;
	POINTS ptEnd;
} ORDERS_GCARC;

typedef struct _ORDERL_GCARC {	/* olgcarc */
	POINTL ptInter;
	POINTL ptEnd;
} ORDERL_GCARC;

/* Begin Element */
#define OCODE_GBEL	0xD2	/* Begin Element	       */

#define GBEL_DL 	251
typedef struct _ORDER_GBEL {	/* ogbel */
	LONG lElementType;
	CHAR achDesc[GBEL_DL];
} ORDER_GBEL;

/* Begin Image */
#define OCODE_GCBIMG	0x91		/* Begin Image at curr posn    */
#define OCODE_GBIMG	0xD1		/* Begin Image at given posn   */

typedef struct _ORDER_GCBIMG {	/* ogbimg */
	UCHAR	  uchFormat;
	UCHAR	  uchReserved;
	SWPUSHORT cx;
	SWPUSHORT cy;
} ORDER_GCBIMG;

/* Begin Path */
#define OCODE_GBPTH	0xD0		/* Begin Path		       */

typedef struct _ORDER_GBPTH {	/* ogbpth */
	USHORT usReserved;
	LONG   idPath;
} ORDER_GBPTH;

/* Box */
#define OCODE_GCBOX	0x80		/* Box at current position     */
#define OCODE_GBOX	0xC0		/* Box at given position       */

typedef struct _ORDERS_GCBOX {	/* osgcbox */
	UCHAR  fbFlags;
	UCHAR  uchReserved;
	POINTS ptCorner;
	SHORT  hAxis;
	SHORT  vAxis;
} ORDERS_GCBOX;

typedef struct _ORDERL_GCBOX {  /* olgcbox */
	UCHAR  fbFlags;
	UCHAR  uchReserved;
	POINTL ptCorner;
	LONG   hAxis;
	LONG   vAxis;
} ORDERL_GCBOX;

#define GCBOX_FILL	0x40
#define GCBOX_BOUNDARY	0x20

/* Call Segment */
#define OCODE_GCALLS	0x07		/* call segment 	       */

typedef struct _ORDER_GCALLS {  /* ogcalls */
	USHORT sReserved;
	LONG   idSegment;
} ORDER_GCALLS;

/* Fill Path */
#define OCODE_GFPTH	0xD7		/* Fill path		       */
typedef struct _ORDER_GFPTH {  /* ogfpth */
	UCHAR  fbFlags;
	UCHAR  uchReserved;
	LONG   idPath;
} ORDER_GFPTH;

#define GFPTH_ALTERNATE 0x00
#define GFPTH_WINDING   0x40
#define GFPTH_MODIFY    0x20

/* Outline Path */
#define OCODE_GOPTH    0xD4            /* Outline Path                */
typedef struct _ORDER_GOPTH {  /* ogopth */
	UCHAR  fbFlags;
	UCHAR  uchReserved;
	LONG   idPath;
} ORDER_GOPTH;

/* Modify Path */
#define OCODE_GMPTH 0xD8               /* modify path                 */

typedef struct _ORDER_GMPTH {   /* ogmpth */
	UCHAR  uchMode;
	UCHAR  uchReserved;
	LONG   idPath;
} ORDER_GMPTH;

#define GMPTH_STROKE    0x06

/* Partial Arc */
#define OCODE_GCPARC   0xA3            /* Partial arc at curr posn    */
#define OCODE_GPARC    0xE3            /* Partial arc at given posn   */

typedef struct _ORDERS_GCPARC { /* osgcparc */
	POINTS	 ptCenter;
	FIXED88  ufx88Multiplier;
	LONG	 usStartAngle;
	LONG	 usSweepAngle;
} ORDERS_GCPARC;

typedef struct _ORDERL_GCPARC { /* olgcparc */
	POINTL	 ptCenter;
	FIXED	 ufxMultiplier;
	LONG	 usStartAngle;
	LONG	 usSweepAngle;
} ORDERL_GCPARC;

/* Set Clip Path */
#define OCODE_GSCPTH   0xB4            /* Set clip path               */

typedef struct _ORDER_GSCPTH {  /* ogscpth */
	UCHAR  fbFlags;
	UCHAR  uchReserved;
	LONG   idPath;
} ORDER_GSCPTH;

#define GSCPTH_ALTERNATE 0x00
#define GSCPTH_WINDING   0x40
#define GSCPTH_RESET     0x00
#define GSCPTH_INTERSECT 0x20

/* Set Arc Parameters */
#define OCODE_GSAP     0x22            /* Set arc parameters          */
#define OCODE_GPSAP    0x62            /* Push and set arc params     */

typedef struct _ORDERS_GSAP {   /* osgsap */
	SHORT  p;
	SHORT  q;
	SHORT  r;
	SHORT  s;
} ORDERS_GSAP;

typedef struct _ORDERL_GSAP {   /* olgsap */
	LONG   p;
	LONG   q;
	LONG   r;
	LONG   s;
} ORDERL_GSAP;

/* Set Background Indexed Color */
#define OCODE_GSBICOL  0xA7            /* Set b/g indexed color       */
#define OCODE_GPSBICOL 0xE7            /* Push and set b/g ind color  */
#define OCODE_GSICOL   0xA6            /* Set indexed color           */
#define OCODE_GPSICOL  0xE6            /* Push and set indexd color   */

typedef struct _ORDER_GSBICOL { /* ogbicol */
	UCHAR  fbFlags;
	UCHAR  auchColor[3];
} ORDER_GSBICOL;

#define SICOL_SPECIFY  0x00
#define SICOL_SPECIAL  0x40
#define SICOL_DEFAULT  0x80
#define SICOL_BLACK    1
#define SICOL_WHITE    2
#define SICOL_ONES     4
#define SICOL_ZEROES   5

/* Set Character Cell */
#define OCODE_GSCC     0x33            /* Set character cell          */
#define OCODE_GPSCC    0x03            /* Push and set char cell      */

typedef struct _ORDERS_GSCC {   /* osgscc */
	SHORT  cxInt;
	SHORT  cyInt;
	USHORT cxFract;
	USHORT cyFract;
	UCHAR  fbFlags;
	UCHAR  uchReserved;
} ORDERS_GSCC;

typedef struct _ORDERL_GSCC {   /* olgscc */
	LONG   cxInt;
	LONG   cyInt;
	USHORT cxFract;
	USHORT cyFract;
	UCHAR  fbFlags;
	UCHAR  uchReserved;
} ORDERL_GSCC;

#define GSCC_ZERODEF   0x00
#define GSCC_ZEROZERO  0x80

/* Set Marker Cell */
#define OCODE_GSMC     0x37            /* Set marker cell             */
#define OCODE_GPSMC    0x77            /* Push and set marker cell    */

typedef struct _ORDERS_GSMC {   /* osgsmc */
	SHORT  cx;
	SHORT  cy;
	UCHAR  fbFlags;
	UCHAR  uchReserved;
} ORDERS_GSMC;

typedef struct _ORDERL_GSMC {   /* olgsmc */
	LONG   cx;
	LONG   cy;
	UCHAR  fbFlags;
	UCHAR  uchReserved;
} ORDERL_GSMC;

#define GSMC_ZERODEF   0x00
#define GSMC_ZEROZERO  0x80

/* Set Pattern Reference Point */
#define OCODE_GSPRP    0xA0            /* Set pattern ref point       */
#define OCODE_GPSPRP   0xE0            /* Push and set patt ref pt    */

typedef struct _ORDERS_GSPRP {  /* osgsprp */
	UCHAR fbFlags;
	UCHAR uchReserved;
	POINTS ptPos;
} ORDERS_GSPRP;

typedef struct _ORDERL_GSPRP {  /* olgsprp */
	UCHAR fbFlags;
	UCHAR uchReserved;
	POINTL ptPos;
} ORDERL_GSPRP;

#define GSPRP_DEFAULT  0x80
#define GSPRP_SPECIFY  0x00


/* Set Individual Attribute */
#define OCODE_GSIA     0x14            /* Set individual attribute    */
#define OCODE_GPSIA    0x54            /* Push and set ind attr       */

#define GSIA_VL 3
typedef struct _ORDER_GSIA {    /* ogsia */
	UCHAR  uchAttrType;
	UCHAR  uchPrimType;
	UCHAR  fbFlags;
	UCHAR  auchValue[GSIA_VL];
} ORDER_GSIA;

#define GSIA_COLOR     0x01
#define GSIA_BCOLOR    0x02
#define GSIA_MIX       0x03
#define GSIA_BMIX      0x04
#define GSIA_LINE      0x01
#define GSIA_CHAR      0x02
#define GSIA_MARKER    0x03
#define GSIA_PATTERN   0x04
#define GSIA_IMAGE     0x05
#define GSIA_SPECIFY   0x00
#define GSIA_SPECIAL   0x40
#define GSIA_DEFAULT   0x80
#define GSIA_BLACK     1
#define GSIA_WHITE     2
#define GSIA_ONES      4
#define GSIA_ZEROES    5


/* Set Model /Viewing Transform */
#define OCODE_GSTM     0x24            /* Set model transform         */
#define OCODE_GPSTM    0x64            /* Push and set model tfm      */

#define OCODE_GSTV     0x31            /* Set Viewing Transform       */

#define GSTM_ML        16
typedef struct _ORDERS_GSTM {    /* osgstm */
	UCHAR  uchReserved;
	UCHAR  fbFlags;
	USHORT fsMask;
	SHORT  asMatrix[GSTM_ML];
} ORDERS_GSTM;

typedef struct _ORDERL_GSTM {    /* olgstm */
	UCHAR  uchReserved;
	UCHAR  fbFlags;
	USHORT fsMask;
	LONG   alMatrix[GSTM_ML];
} ORDERL_GSTM;

#define GSTM_M11     0x8000
#define GSTM_M12     0x4000
#define GSTM_M13     0x2000
#define GSTM_M14     0x1000
#define GSTM_M21     0x0800
#define GSTM_M22     0x0400
#define GSTM_M23     0x0200
#define GSTM_M24     0x0100
#define GSTM_M31     0x0080
#define GSTM_M32     0x0040
#define GSTM_M33     0x0020
#define GSTM_M34     0x0010
#define GSTM_M41     0x0008
#define GSTM_M42     0x0004
#define GSTM_M43     0x0002
#define GSTM_M44     0x0001

#define GSTM_UNITY     0x00
#define GSTM_AFTER     0x01
#define GSTM_BEFORE    0x02
#define GSTM_OVERWRITE 0x03

#define GSTV_OVERWRITE 0x00
#define GSTV_AFTER     0x04

/* Set Segment Boundary, Viewing Window */

#define OCODE_GSSB     0x32            /* Set segment boundary        */
#define OCODE_GSVW     0x27            /* Set viewing window          */
#define OCODE_GPSVW    0x67            /* Push and set view window    */

#define GSSB_ML        4
typedef struct _ORDERS_GSSB {   /* osgssb */
	UCHAR  fbFlags;
	UCHAR  fbMask;
	SHORT  alMatrix[GSSB_ML];
} ORDERS_GSSB;

typedef struct _ORDERL_GSSB {   /* olgssb */
	UCHAR  fbFLags;
	UCHAR  fbMask;
	LONG   alMatrix[GSSB_ML];
} ORDERL_GSSB;

#define GSSB_XLEFT     0x20
#define GSSB_XRIGHT    0x10
#define GSSB_YBOTTOM   0x08
#define GSSB_YTOP      0x04

#define GSVW_INTERSECT 0x00
#define GSVW_REPLACE   0x80

/* Set Segment Characteristics */
#define OCODE_GSGCH    0x04            /* Set segment characteristics */

#define GSGCH_ML       254
typedef struct _ORDER_GSGCH {   /* ogsgch */
	UCHAR  uchIdent;
	UCHAR  auchData[GSGCH_ML];
} ORDER_GSGCH;

/* Set Stroke Line Width */
#define OCODE_GSSLW    0x15            /* Set stroke line width       */
#define OCODE_GPSSLW   0x55            /* Push and set strk l width   */

typedef struct _ORDERS_GSSLW {  /* osgsslw */
	UCHAR  fbFlags;
	UCHAR  uchReserved;
	SHORT  LineWidth;
} ORDERS_GSSLW;

typedef struct _ORDERL_GSSLW {  /* olgsslw */
	UCHAR  fbFlags;
	UCHAR  uchReserved;
	LONG   LineWidth;
} ORDERL_GSSLW;

#define GSSLW_DEFAULT  0x80
#define GSSLW_SPECIFY  0x00

/* Sharp Fillet at Current Position */
#define OCODE_GCSFLT   0xA4            /* Sharp fillet at curr pos    */
#define OCODE_GSFLT    0xE4            /* Sharp fillet at given pos   */

#define GCSFLT_SMF     21
#define GSFLT_SMF      20

typedef struct _ORDERS_GCSFLT { /* osgcsflt */
	POINTS apt[2*GCSFLT_SMF];
	FIXED  afxSharpness[GCSFLT_SMF];
} ORDERS_GCSFLT;

#define GCSFLT_LMF     12
#define GSFLT_LMF      12

typedef struct _ORDERL_GCSFLT { /* olgcsflt */
	POINTL apt[2*GCSFLT_SMF];
	FIXED  afxSharpness[GCSFLT_SMF];
} ORDERL_GCSFLT;

/* Bitblt */
#define OCODE_GBBLT    0xD6            /* Bitblt                      */

typedef struct _ORDERS_GBBLT {   /* osgbblt */
	USHORT	fsFlags;
	USHORT	usMix;
	HBITMAP hbmSrc;
	LONG	lOptions;
	RECT1S	rcsTargetRect;
	RECTL	rclSourceRect;
} ORDERS_GBBLT;

typedef struct _ORDERL_GBBLT {   /* olgbblt */
	USHORT	fsFlags;
	USHORT	usMix;
	HBITMAP hbmSrc;
	LONG	lOptions;
	RECTL	rclTargetRect;
	RECTL	rclSourceRect;
} ORDERL_GBBLT;

/* Escape */
#define OCODE_GESCP    0xD5            /* Escape                      */

/*
 * type describes type of escape order, identifier gives the escape
 * order if the type is registered
 */
#define GESCP_ML       253
typedef struct _ORDER_GESCP {   /* ogescp */
	UCHAR  uchType;
	UCHAR  uchIdent;
	UCHAR  auchData[GESCP_ML];	     /* Escape data		    */
} ORDER_GESCP;

#define GESCP_REG      0x80            /* identifier is registered    */

/* Escape (Bitblt) */
#define GEBB_REGID     0x02            /* uchIdent - Bitblt           */

#define ETYPE_GEBB          0x800200D5L

#define GEBB_LMP       29
typedef struct _ORDERL_GEBB {   /* olgebb */
	UCHAR	fbFlags;
	USHORT	usMix;
	UCHAR	cPoints;
	HBITMAP hbmSrc;
	LONG	lReserved;
	LONG	lOptions;
	POINTL	aptPoints[GEBB_LMP];
} ORDERL_GEBB;

/* Escape (Set Pel) */
#define GEPEL_REGID    0x01            /* uchIdent - Set Pel          */

#define ETYPE_GEPEL         0x800100D5L

/* Element Types for attribute bundles */
#define ETYPE_LINEBUNDLE    0x0000FD01L
#define ETYPE_CHARBUNDLE    0x0000FD02L
#define ETYPE_MARKERBUNDLE  0x0000FD03L
#define ETYPE_AREABUNDLE    0x0000FD04L
#define ETYPE_IMAGEBUNDLE   0x0000FD05L

/***************************************************************************\
*
* Very long orders
*
\***************************************************************************/

/* macro to tell whether this is a very long order */
#define VLONG_ORDER(oc)  ((oc)==OCODE_VLONG)

/* Very long order structure */
#define VORDER_ML 65531
typedef struct _VORDER {        /* vord */
	UCHAR	  idCode;
	UCHAR	  uchQualifier;
	SWPUSHORT uchLength;
	UCHAR	  uchData[VORDER_ML];
} VORDER;

/* Character String Extended */
#define OCODEQ_GCCHSTE	0xB0	/* Qualifier - current posn    */
#define OCODEQ_GCHSTE	0xF0	/* Qualifier - given position  */

#define ETYPE_GCCHSTE	0x0000FEB0L
#define ETYPE_GCHSTE	0x0000FEF0L

typedef struct _ORDERS_GCCHSTE { /* osgcchste */
	UCHAR	  fbFlags;
	UCHAR	  uchReserved;
	POINTS	  ptRect[2];
	SWPUSHORT cchString;
	CHAR	  achString[1];
	SHORT	  adx[1];
} ORDERS_GCCHSTE;

typedef struct _ORDERL_GCCHSTE { /* olgcchste */
  UCHAR     fbFlags;
  UCHAR     uchReserved;
  POINTL    ptRect[2];
  SWPUSHORT cchString;
  CHAR      achString[1];
  LONG      adx[1];
} ORDERL_GCCHSTE;

#define GCCHSTE_DRAWRECT	0x80
#define GCCHSTE_NORECT		0x00
#define GCCHSTE_CLIP		0x40
#define GCCHSTE_NOCLIP		0x00
#define GCCHSTE_DEEMPHASIZE	0x20
#define GCCHSTE_NODEEMPHASIZE	0x00
#define GCCHSTE_LEAVEPOS	0x10
#define GCCHSTE_MOVEPOS 	0x00

/* Extended Escape */
#define OCODEQ_GEESCP	 0xD5		/* Qualifier - extended escape */

#define GEESCP_ML      65533
typedef struct _ORDER_GEESCP {  /* ogeescp */
	UCHAR  uchType;
	UCHAR  uchIdent;
	UCHAR  auchData[GEESCP_ML];
} ORDER_GEESCP;
